import numpy as np
from scipy.spatial.distance import euclidean, cosine

# 1. 定义向量数据
def generate_vectors(dimensions=3):
    """ 
生成两个随机向量
:param dimensions: 向量的维度
:return: 两个随机向量
""" 
    np.random.seed(42) # 保证结果可重复
    vector_a = np.random.rand(dimensions)
    vector_b = np.random.rand(dimensions)
    return vector_a, vector_b

vector_a, vector_b = generate_vectors(dimensions=3)

# 2. 计算欧氏距离
def calculate_euclidean_distance(vec_a, vec_b):
    """ 
计算两个向量之间的欧氏距离
:param vec_a: 向量A
:param vec_b: 向量B
:return: 欧氏距离
"""
    return np.sqrt(np.sum((vec_a - vec_b) ** 2))

euclidean_distance = calculate_euclidean_distance(vector_a, vector_b)

# 3. 计算余弦相似度
def calculate_cosine_similarity(vec_a, vec_b):
    """ 
计算两个向量之间的余弦相似度
:param vec_a: 向量A
:param vec_b: 向量B
:return: 余弦相似度
""" 
    dot_product = np.dot(vec_a, vec_b)
    norm_a = np.linalg.norm(vec_a)
    norm_b = np.linalg.norm(vec_b)
    return dot_product / (norm_a * norm_b)

cosine_similarity = calculate_cosine_similarity(vector_a, vector_b)

# 4. 使用 scipy 计算距离和相似度
euclidean_distance_scipy = euclidean(vector_a, vector_b)
cosine_similarity_scipy = 1 - cosine(vector_a, vector_b)
# scipy 的余弦距离需转换为相似度

# 5. 输出结果
print("向量 A:", vector_a)
print("向量 B:", vector_b)
print("\n自定义函数计算结果:")
print(f"欧氏距离: {euclidean_distance:.6f}")
print(f"余弦相似度: {cosine_similarity:.6f}")
print("\nSciPy 计算结果:")
print(f"欧氏距离: {euclidean_distance_scipy:.6f}")
print(f"余弦相似度: {cosine_similarity_scipy:.6f}")